package tij4.polymorphism.source;

class Characteristic {
    private String s;
    Characteristic(String s) {
        this.s = s;
        System.out.println("Creating Characteristic " + s);
    }
    protected void dispose() {
        System.out.println("disposing Characteristic " + s);
    }
}

class Desciption {
    private String s;
    Desciption(String s) {
        this.s = s;
        System.out.println("Creating Description " + s);
    }
    protected void dispose() {
        System.out.println("dispose Description " + s);
    }
}

class LivingCreature {
    private Characteristic p = new Characteristic("is alive");
    private Desciption t = new Desciption("Basic Living Creature");
    LivingCreature() {
        System.out.println("LivingCreature()");
    }
    protected void  dispose() {
        System.out.println("LivingCreatrue dispose");
        t.dispose();
        p.dispose();
    }
}

class Animal extends LivingCreature {
    private Characteristic p = new Characteristic("has heart");
    private Desciption t = new Desciption("Animal not Vegetable");
    Animal(/*String s*/) {      //因为此类的导出类都是调用的此类的默认构造方法
        System.out.println("Animal()");
    }
    protected void dispose() {
        System.out.println("Animal dispose");
        t.dispose();
        p.dispose();
        super.dispose();
    }
}

class Amphibian extends Animal {
    private Characteristic p = new Characteristic("can live in water");
    private Desciption t = new Desciption("Both water and land");
    Amphibian() {
        System.out.println("Amphibian()");
    }
    protected void dispose() {
        System.out.println("Amphibian dispose");
        t.dispose();
        p.dispose();
        super.dispose();
    }
}

public class Frog extends Amphibian {
    private Characteristic p = new Characteristic("Croaks");
    private Desciption t = new Desciption("Eats Bugs");

    public Frog() {
        System.out.println("Frog()");
    }
    protected void dispose() {
        System.out.println("Frog dispose");
        t.dispose();
        p.dispose();
        super.dispose();
    }

    public static void main(String[] args) {
        Frog frog = new Frog();
        System.out.println("Bye!");
        frog.dispose();
    }
}

/*
    实例化导出类的基类时是从 new 关键字开始?还是从构造方法开始?
 */
/*
    构造方法开始...
    Creating Characteristic Croaks
    Creating Description Eats Bugs
    Creating Characteristic is alive
    Creating Description is alive
    LivingCreature()
    Creating Characteristic has heart
    Creating Description Animal not Vegetable"
    Animal()
    Creating Characteristic can live in water
    Creating Description Both water and land
    Amphibian()
    Frog()
    Bye!
    ......
    实验得出构造方法开始错误!!!!
 */
/*
    从 new 关键字开始
    Creating Characteristic is alive
    Creating Description Basic Living Creature
    LivingCreature()
    Creating Characteristic has heart
    Creating Description Animal not Vegetable
    Animal()
    Creating Characteristic can live in water
    Creating Description Both water and land
    Amphibian()
    Creating Characteristic Croaks
    Creating Description Eats Bugs
    Frog()
    Bye!
    Frog dispose
    dispose Description Eats Bugs
    disposing Characteristic Croaks
    Amphibian dispose
    dispose Description Both water and land
    disposing Characteristic can live in water
    Animal dispose
    dispose Description Animal not Vegetable
    disposing Characteristic has heart
    LivingCreatrue dispose
    dispose Description Basic Living Creature
    disposing Characteristic is alive
    这是对的
 */
